﻿#pragma once

#include <Plugin.h>
#include <string>
#include "Client.h"
// #include <RakPeerInterface.h>
#include <HLInternet.h>

class PluginNet : public Plugin
{
public:
	PluginNet(void);
	virtual ~PluginNet(void);

	// initialize plugin
	virtual int Init();

	// shutdown plugin
	virtual int Shutdown();

	/**
	* @brief HTTP POST请求
	* @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com
	* @param strPost 输入参数,使用如下格式para1=val1¶2=val2&…
	* @param strResponse 输出参数,返回的内容
	* @return 返回是否Post成功
	*/
	int Post(const char *strUrl, const char *strPost);

	/**
	* @brief HTTP GET请求
	* @param strUrl 输入参数,请求的Url地址,如:http://www.baidu.com
	* @param strResponse 输出参数,返回的内容
	* @return 返回是否Post成功
	*/
	int Get(const char *strUrl);

	/**
	* @brief HTTPS POST请求,无证书版本
	* @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com
	* @param strPost 输入参数,使用如下格式para1=val1¶2=val2&…
	* @param strResponse 输出参数,返回的内容
	* @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性.
	* @return 返回是否Post成功
	*/
	int Posts(const char *strUrl, const char *strPost, const char * pCaPath = NULL);

	/**
	* @brief HTTPS GET请求,无证书版本
	* @param strUrl 输入参数,请求的Url地址,如:https://www.alipay.com
	* @param strResponse 输出参数,返回的内容
	* @param pCaPath 输入参数,为CA证书的路径.如果输入为NULL,则不验证服务器端证书的有效性.
	* @return 返回是否Post成功
	*/
	int Gets(const char *strUrl, const char * pCaPath = NULL);

	const char* GetResponse() const { if (m_pInternet) return m_pInternet->GetResponse().c_str(); else return ""; }

	const char* GetBody();

	void InitSocket(const char* name, const char* ip);
	void CloseSocket();
	void Listening();

	void SendMsg(const char* content, const char* target = 0);

private:
	HL::Internet* m_pInternet;

	char m_sJSON[1024];

	struct _Response
	{
		const char* status;
		const char* msg;
		const char* userId;
		const char* userName;
		const char* blog;
	} m_Response;

	bool m_bGateConnected;
	bool m_bClientConnected;
	Client* m_pGate;
	Client* m_pClient;

	bool m_bServer;
	char m_sName[256];
// 	RakNet::RakPeerInterface* m_pRaknet;
// 	RakNet::Packet* m_pPacket;
// 	char m_sMessage[2048];
};

extern "C" __declspec(dllexport) void *CreatePlugin()
{
	return new PluginNet();
}

extern "C" __declspec(dllexport) void ReleasePlugin(void *plugin)
{
	delete static_cast<PluginNet*>(plugin);
}